Search

本篇文章要來探討 Kubernetes/Docker 一些關於 connection timeout...

  • Share this:

本篇文章要來探討 Kubernetes/Docker 一些關於 connection timeout 的事情,文章非常長,這邊幫大家重點整理

1. 跟我之前分享的 DNS timeout 問題類似,都會踩到 Kernel 的 race condition,都是 __ip_conntrack_confirm 這個人丟掉大家封包的
2. 本文著重於怎麼發現這個問題,如何減緩這個問題。對於喜歡研究細節的人值得一看。
3. 2017年底作者團隊開始將服務遷移到 Kubernetes (v1.8), Flannel(1.9.0),開始發現團隊中基於 Scala 的應用程式出現封包 timeout 的問題,這導致部分請求回應都延遲1-3秒
4. 決定認真調查網路問題,經由研究與錄製封包後發現 TCP 重送(SYN)的現象,該現象導致第一個封包會特別慢
5. 接下來要縮小範圍,使用環境中的一個VM作為基底,上面安裝 docker,開始觀察相關的網路流量與封包,發現可以重製這個行為,第一個封包從容器出去後,宿主機上面的真實網卡卻看不到,直到下次第二個封包就可以。藉由這個行為他們判斷,問題出在VM上,跟底層其餘硬體架構無關,藉此縮小問題範圍。
6. 介紹 iptalbes + SNAT + conntrack
7. 問題發生在 Kernel 裡面針對 SNAT 去選擇對外 source IP 時會出錯,因為(1)挑選一個適當的 source port, (2)將該紀錄寫到 conntrack 這兩個步驟中間會有落差,因此如果兩個封包同時進入(1),選到一樣的結果,後續要跑(2)就會有一個人寫不進去,導致封包被丟棄
8. 一種解決方法是告訴 kernel 請隨機幫我挑選對外的 source port, 這樣就算大家同時執行(1),有很大的機會會挑到不同的 source port,藉此減少衝突的機會。
9. iptables 執行 --masquerate 的時候可以下 --random-fully 這個參數
10. 團隊當時客製化 Flannel 來解決這個問題

註: 對 SNAT 有興趣瞭解的可以參考我之前撰寫的 SNAT Kernel 原始碼閱讀文章
https://www.hwchiu.com/iptables-masquerade.html
https://www.hwchiu.com/iptables-masquerade-handson.html

https://tech.xing.com/a-reason-for-unexplained-connection-timeouts-on-kubernetes-docker-abd041cf7e02


Tags:

About author
目前工作內容主要以 DevOps 為主,本身是微軟 Cloud and Datacenter Management MVP,閒暇之餘會透過文章記錄所學,記錄於 https://www.hwchiu.com. 喜歡參加社群活動來學習不同的經驗,藉此增廣見聞 目前主要參加的社群是 CNTUG,偶而會參加線上 Meetup ,透過網路的方式分享一些心得,並且錄影分享於 Youtube 上
工作與閒暇之餘的學習筆記,紀錄各式各樣的科技文章,同時分享自身部落格文章,線上社群演講以及線上課程資訊
View all posts